// #include<stdio.h>
// #include<stdlib.h>
//
// void print_array(int arr[],int len)
// {
//     for (int i=0;i<len;i++)
//     {
//         printf("%d\n",arr[i]);
//     }
// }
//
// void print_array_1(int *arr,int len)
// {
//     for (int i=0;i<len;i++)
//     {
//         printf("%d\n",arr[i]);
//     }
// }
//
// int my_strlen(const char* str)
// {
//     int count = 0;
//     while (str[count] != '\0')
//     {
//
//         count++;
//     }
//     return count;
// }
//
// void test_one()
// {
//     int arr[3][5] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
//     int *p = &arr[0][0];
//     //根据指针去做偏移 行列转换为序号
//     for (int i=0;i<15;i++)
//     {
//         printf("%d\n",*(p+i));
//     }
// }
//
// void  test_two()
// {
//     int arr[3][5] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
//     //二维数组的数组名 偏移的一行  数组指针
//     printf("%p\n",arr);
//     printf("%p\n",arr+1);
//     //二维数组的数组名+一个下标 转换为一个以及指针
//     printf("%p\n",arr[0]);
//     printf("%p\n",arr[0]+1);
//
//     //数组指针 指向一个数组的指针 //推荐用法
//     int(*p)[5]=arr;
//     for (int i=0;i<3;i++)
//     {
//         for (int j=0;j<5;j++)
//         {
//             printf("%d\t",*(p[i]+j));
//             // printf("%d\t",*(*(p+i))+j);
//             // printf("%d\t",p[i][j]);
//             // p[i]==>A A[j]=*(A+j)
//             // p[i]=*(p+i)==>A
//
//         }
//         printf("\n");
//     }
//
//
// }
//
// void print_arr_two(int(*p)[5],int row)
// {
//     for (int i=0;i<row;i++)
//     {
//         for (int j=0;j<5;j++)
//         {
//             printf("%d\t",*(*(p+i)+j));
//         }
//         printf("\n");
//     }
// }
//
//
// void modify_one(int a)
// {
//     a = 100;
// }
//
// void modify_two(int* p)
// {
//     *p = 100;
// }
//
// //如果修改实参的值 传入实参的地址 修改是*地址
// int g_num = 1000;
// void modify_three(int** p)
// {
//     *p=&g_num;
// }
//
// //返回指针问题
// //不允许返回局部变量的地址
// // int* return_num()
// // {
// //     int num = 10;
// //     return &num;
// // }
//
// //需要区分是什么叫做局部变量
// //这个不叫地址
// int* get_num_one(int*p)
// {
//     return p;
// }
//
// //可以返回堆区内存地址 自己申请和释放
//
// //返回一个数组的函数  只需要返回数组的首地址
// int array[3]={1,2,3};
// int*  get_array()
// {
//     return array;
// }
//
// int main(){
//
//    // //二级指针 n级指针存放n-1级指针的地址
//    //  int num =10;
//    //  int* p1 =  &num;
//    //  int** p2 =  &p1;
//    //  int *** p3 = &p2;
//    //
//    //
//    //  printf("num = %d\n",num);
//    //  printf("*p1 = %d\n",*p1);
//    //  printf("**p2 = %d\n",**p2);
//    //  printf("***p3 = %d\n",***p3);
//    //  printf("***p3 = %d\n",p3[0][0][0]);
//    //
//    //  //指针操作数组
//    //  //指针操作一维数组
//    //  int arr[5] = {1,2,3,4,5};
//    //  int* parr = arr;
//    //  printf("================================\n");
//    //  //推荐这种
//    //  printf("%d\n",parr[0]);
//    //  printf("%d\n",parr[1]);
//    //  printf("%d\n",parr[2]);
//    //  printf("%d\n",parr[3]);
//    //  printf("%d\n",parr[4]);
//    //  printf("================================\n");
//    //  printf("%d\n",*(parr+0));
//    //  printf("%d\n",*(parr+1));
//    //  printf("%d\n",*(parr+2));
//    //  printf("%d\n",*(parr+3));
//    //  printf("%d\n",*(parr+4));
//    //  printf("================================\n");
//    //
//    //  //更改指针的指向 这parr 指向数组的最后 下次用的时候 需要考虑下
//    //  while (parr != arr+5)
//    //  {
//    //      printf("%d\n",*parr++);
//    //  }
//    //
//    //  printf("================================\n");
//    //  //非常规的修改方式
//    //  int data[10]={1,2,3,4,5,6,7,8,9,10};
//    //
//    //  int*pp = &data[5];
//    //
//    //  printf("%d\n",pp[0]);
//    //
//    //  for (int i=-5;i<0;i++)
//    //  {
//    //      printf("%d\n",*(pp+i));
//    //  }
//    //
//    //  printf("================================\n");
//    //
//    //  //如果不写const c++中会报错
//    //  int c = my_strlen("hello world");
//    //  printf("%d\n",c);
//    //
//    //  //指针操作二维数组
//    //  printf("================================\n");
//    //
//    //  test_one();
//
//
//     test_two();
//
//     int  arr[3][5] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
//     print_arr_two(arr,3);
//
//     //万能指针 void *类型的指针称之为万能指针  可以存储任何类型的地址
//     //void* p = NULL;
//     void* p = NULL;
//     int num = 10;
//     p = &num;
//     printf("%d\n",*(int*)p);
//     double d = 3.14;
//     p = &d;
//     printf("%2lf\n",*(double*)p);
//
//     //指针在使用的时候要做目标类型的强制类型转换
//
//
//     //函数传参 传指针的情况 指针函数问题 基本指针的函数
//     //传参问题 传指针问题
//
//
//     //返回指针问题
//
//     int tnum = 10;
//     modify_one(tnum);
//     printf("%d\n",tnum);
//     modify_two(&tnum);
//     printf("%d\n",tnum);
//
//     int* pnum = &tnum;
//     modify_three(&pnum);
//     printf("%d\n",pnum[0]);
//
//     int* ptarr = get_array();
//     printf("%d\n",ptarr[0]);
//     printf("%d\n",ptarr[1]);
//     printf("%d\n",ptarr[2]);
//
//     printf("================================\n");
//
//
//     return 0;
// }